home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Day Cry
/
Day Cry CD.bin
/
oh_towns
/
ugoku
/
src.lzh
/
MOVRLF
/
MRLFPLY.C
< prev
next >
Wrap
Text File
|
1994-09-10
|
15KB
|
686 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <file_dlg.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include "ugoku.h"
#include "movrlf.h"
/* V00ì─É╢ */
v00WakuClearPlay( char *name )
{
int ret ;
int frame, x, y, wt ;
int dummy ;
ret = v00_head_read( name, &frame, &x, &y, &wt ) ;
if( ret == NOERR )
{
v_waku_clear( x, y, 2 ) ; /* ÿgö▓é½ */
MG_mosDisp( 0 ) ;
ret = v00_play2( name, 0, 0x7fffffff, &dummy, 0 );
MG_mosDisp( 1 ) ;
}
return ret ;
}
/* MVBì─É╢ */
mvbWakuClearPlay( char *name )
{
int ret ;
int frame, x, y, wt ;
ret = mvb_head_read( name, &frame, &x, &y, &wt ) ;
if( ret == NOERR )
{
v_waku_clear( x, y, 2 ) ; /* ÿgö▓é½ */
MG_mosDisp( 0 ) ;
ret = mvb_play2( name, 0, 0x7fffffff, 0 );
MG_mosDisp( 1 ) ;
}
return ret ;
}
/*
v00 play 2 âtâîü[âÇé╠ôrÆåé⌐éτì─É╢ë┬ö\
*/
static v00_play2( name, p1, p2, f, w )
char name[] ;
int p1, p2, *f, w ;
{
FILE *fp, *fps;
int wait, orgWait, n, point ;
int v00xd = 128, v00yd = 96;
int temp, size, sbflg, note;
char head[256];
char para[64], names[100];
char *sbuf, *buf; /* buffer */
*f = -1 ;
if( p2 < p1 )p2 = p1 ;
if( (buf = (char *)TL_malloc( 320*240*2 )) == NULL ){
return 7;
}
/* mute */
int s ;
SND_get_elevol_mute( &s ) ;
SND_elevol_mute( s | 0x01 ) ;
sbflg = 0;
if( file_kakuchousi_set( names, name, ".SND" ) )goto vd02;
if( ( fps = fopen( names, "rb" ) ) == NULL )goto vd02;
if( fread( buf, 32, 1, fps ) < 1 )goto vd01;
size = DWORD( buf+12 ) ;
point = DWORD( buf+16 ) + p1 * 800 ;
note = BYTE( buf+28 );
if( (sbuf = (char *)TL_malloc( size + 32 )) == NULL )goto vd01;
sbflg = -1; /* buffer open */
fseek( fps, 0, SEEK_SET );
if( fread( sbuf, 32, 1, fps ) < 1 )goto vd01;
if( ( point > 0 ) && ( point <= size ) )
{
size = size - point ;
fseek( fps, point, SEEK_CUR );
DWORD( sbuf+12 ) = size ;
}
if( fread( sbuf + 32, size, 1, fps ) < 1 )goto vd01;
sbflg = 1; /* pcm play ok */
SND_pcm_sound_delete( -1 );
SND_pcm_mode_set( 1 );
vd01: fclose( fps );
vd02: if( ( fp = fopen( name, "rb" ) ) == NULL )
{
if( sbflg )TL_free( sbuf );
TL_free( buf );
return 1;
}
if( fread( head, 256, 1, fp ) < 1 ){ /* âwâbâ_ü[ */
fclose(fp);
if( sbflg )TL_free( sbuf );
TL_free( buf );
return 1;
}
if
(
(DWORD( head + 0 ) == 0x30304456) /* VD00 */
&& (DWORD( head + 12 ) == 0x80008000) /* dataé╠Äφù▐ö╘ìå */
)
{
v00xd = DWORD( head + 16 ); /* ëí */
v00yd = DWORD( head + 20 ); /* Åc */
orgWait = DWORD( head + 24 ); /* âIâèâWâiâïwait */
}
else
{
v00xd = 128; /* ëí */
v00yd = 96; /* Åc */
orgWait = 6; /* Åc */
fseek( fp, 0, SEEK_SET );
}
if( v00xd * v00yd > 320*240 ){ /* ïKèiâIü[âoü[ */
fclose(fp);
if( sbflg )TL_free( sbuf );
TL_free( buf );
return 58;
}
wait = orgWait + w ; /* âEâGâCâgë┴ÄZ */
size = v00xd*v00yd*2; /* ɵæùéΦ */
n = -1 ;
if( fseek( fp, p1*size, SEEK_CUR ) == 0 )
{
n = p1 ;
}
else
{
fclose(fp);
if( sbflg )TL_free( sbuf );
TL_free( buf );
return 1;
}
if( sbflg )
{
WORD( sbuf+24 ) = WORD( sbuf+24 ) * wait / orgWait;
DWORD( sbuf+16 ) = 0 ; /* loop point */
DWORD( sbuf+20 ) = 0 ; /* loop length */
}
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,1,0,0);
EGB_displayStart(guiEgbPtr,2,2,2);
EGB_displayStart(guiEgbPtr,3,v00xd,v00yd);
EGB_displayStart(guiEgbPtr,0,(320-v00xd)/2,(240-v00yd)/2);
EGB_displayPage(guiEgbPtr,1,3);
DWORD(para+0) = (int)buf;
WORD(para+4) = 0x14;
WORD(para+6) = 0;
WORD(para+8) = 0;
WORD(para+10) = 0 + v00xd - 1;
WORD(para+12) = 0 + v00yd - 1;
temp = 1 ;
SND_fm_timer_b_set( 0, 0 ) ;
VSYNC_init();
if( n >= 0 )
{
for( n=p1 ; n<=p2 ; n++ )
{
int ret ;
if( VSYNC_counter < (wait << 1) ) /* é⌐é╚éΦè░æσ */
{
if( fread( buf, size, 1, fp ) < 1 )break ;
while( VSYNC_counter < wait );
VSYNC_counter -= wait ;
EGB_putBlock( guiEgbPtr, 0, para );
ret = play_check() ;
if( ret )
{
if( ret == 1 ){ /* êΩÄ₧ÆΓÄ~é╠îπì─èJé╖éΘ */
VSYNC_counter = 0;
}
if( ret == -1 ){ /* ÅIù╣ */
break ;
}
}
}
else
{
if( fseek( fp, size, SEEK_CUR ) )break;
VSYNC_counter -= wait ;
}
if( temp )
{
if( sbflg ){
SND_pcm_play( 71, note, 127, sbuf );
}
temp = 0;
}
}
}
VSYNC_end();
SND_pcm_sound_delete( -1 );
SND_fm_timer_b_start() ;
*f = n ; /* ì─É╢âtâîü[âÇÉöé≡âoâbâN */
fclose(fp);
if( sbflg )TL_free( sbuf );
TL_free( buf );
EGB_writePage(guiEgbPtr,1); /* mode3é╔Åæé½ì₧é▌ */
EGB_paintMode(guiEgbPtr,0x22);
EGB_writeMode(guiEgbPtr,0);
EGB_displayPage(guiEgbPtr,1,3); /* mode3é¬æOæñ */
return 0;
}
v00_head_read( char *name, int *frame, int *v00xd, int *v00yd, int *wait )
{
FILE *fp;
char head[256] ;
/* âfü[â^â`âFâbâN */
*frame = -1 ;
if( ( fp = fopen( name, "rb" ) ) == NULL )
{
EGB_displayPage(guiEgbPtr,1,3);
EGB_writePage(guiEgbPtr,1); /* mode3é╔Åæé½ì₧é▌ */
return 1;
}
if( fread( head, 256, 1, fp ) < 1 ){ /* âwâbâ_ü[ */
fclose(fp);
EGB_displayPage(guiEgbPtr,1,3);
EGB_writePage(guiEgbPtr,1); /* mode3é╔Åæé½ì₧é▌ */
return 1;
}
if
(
(DWORD( head + 0 ) == 0x30304456) /* VD00 */
&& (DWORD( head + 12 ) == 0x80008000) /* dataé╠Äφù▐ö╘ìå */
)
{
*frame = DWORD( head + 8 ); /* frame */
*v00xd = DWORD( head + 16 ); /* ëí */
*v00yd = DWORD( head + 20 ); /* Åc */
*wait = DWORD( head + 24 ); /* wait */
}
else
{
*v00xd = 128; /* ëí */
*v00yd = 96; /* Åc */
*wait = 6; /* Åc */
fseek( fp, 0, SEEK_SET );
}
/* ì┼Åëé╠âtâîü[âÇé≡ò\Ī */
int size ;
char *buf, para[64] ;
if( (buf = (char *)TL_malloc( 320*240*2 )) == NULL )
{
fclose(fp);
EGB_displayPage(guiEgbPtr,1,3);
EGB_writePage(guiEgbPtr,1); /* mode3é╔Åæé½ì₧é▌ */
return 7;
}
if( (*v00xd) * (*v00yd) > 320*240 ){ /* ïKèiâIü[âoü[ */
fclose(fp);
TL_free( buf );
EGB_displayPage(guiEgbPtr,1,3);
EGB_writePage(guiEgbPtr,1); /* mode3é╔Åæé½ì₧é▌ */
return 58;
}
EGB_writePage(guiEgbPtr,0);
EGB_displayStart(guiEgbPtr,1,0,0);
EGB_displayStart(guiEgbPtr,2,2,2);
EGB_displayStart(guiEgbPtr,3,0,0);
EGB_displayStart(guiEgbPtr,0,(320 - (*v00xd))/2,(240 - (*v00yd))/2);
EGB_displayStart(guiEgbPtr,3,*v00xd,*v00yd);
DWORD(para+0) = (int)buf;
WORD(para+4) = 0x14;
WORD(para+6) = 0;
WORD(para+8) = 0;
WORD(para+10) = 0 + (*v00xd) - 1;
WORD(para+12) = 0 + (*v00yd) - 1;
size = (*v00xd) * (*v00yd) * 2;
if( fread( buf, size, 1, fp ) < 1 )
{
fclose(fp);
TL_free( buf );
EGB_displayPage(guiEgbPtr,1,3);
EGB_writePage(guiEgbPtr,1); /* mode3é╔Åæé½ì₧é▌ */
return 0; /* frame 0ûçé╞éóéñé▒é╞éαéáéΦô╛éΘ */
}
EGB_putBlock( guiEgbPtr, 0, para );
EGB_displayPage(guiEgbPtr,1,3);
EGB_writePage(guiEgbPtr,1); /* mode3é╔Åæé½ì₧é▌ */
fclose(fp);
TL_free( buf );
return 0 ;
}
/*
mvb play 2 âtâîü[âÇé╠ôrÆåé⌐éτì─É╢ë┬ö\
*/
static mvb_play2( name, p1, p2, w )
char name[] ;
int p1, p2, w ;
{
FILE *fp, *fps;
int wait0, wait, n, point, freq, frame ;
int v00xd = 128, v00yd = 96;
int temp, size, sbflg, note;
char head[256];
char para[64], names[100];
char *sbuf, *buf; /* buffer */
temp = mvb_head_read_only( name, &frame, &v00xd, &v00yd, &wait0 ) ;
if( temp )
return temp ;
if( p2 < p1 )p2 = p1 ;
if( (buf = (char *)TL_malloc( 320*240*2 )) == NULL ){
return 7;
}
/* mute */
int s ; /* é▒éñé╖éΘé╞pcmé╛é»é≡oné╔é┼é½éΘ */
SND_get_elevol_mute( &s ) ;
SND_elevol_mute( s | 0x01 ) ;
sbflg = 0;
if( file_kakuchousi_set( names, name, ".SND" ) )goto vd02;
if( ( fps = fopen( names, "rb" ) ) == NULL )goto vd02;
if( fread( buf, 32, 1, fps ) < 1 )goto vd01;
freq = ( ( WORD( buf+24 )*10 + 0x31 ) / 0x62 ) * 100 ; /* freq */
size = DWORD( buf+12 ) ;
point = DWORD( buf+16 ) + p1 * freq * wait0 / 60 ;
note = BYTE( buf+28 );